#pragma once

#include<iostream>
#include<unordered_map>
#include<functional>
#include<ctime>
using namespace std;
using task_t =function<void()>;

void DownLoad()
{
    cout<<"我是下载任务..."<<endl;
}

void Log()
{
    cout<<"我是日志任务..."<<endl;
}

void Sql()
{
    cout<<"我是数据库同步任务..."<<endl;
}

static int number = 0;
class TaskManger
{
public:
    TaskManger()
    {
        srand(time(nullptr));
        InsertTask(DownLoad);
        InsertTask(Log);
        InsertTask(Sql);
    }
    ~TaskManger()
    {}
    //初始化
    void InsertTask(task_t t)
    {
        //unorder_map,没有就插入，有就不插入（可以去重）
        tasks[number++] = t;
    }
    //选择任务
    int SelectTask()
    {
        return rand() % number;
    }
    //执行
    void Excute(int number)
    {
        //查找不到就退出
        if(tasks.find(number) == tasks.end()) return;
        
        tasks[number]();
    }
private:
    unordered_map<int,task_t> tasks;
};

//创建一个全局对象
TaskManger tm1;

// 子进程任务/需要做什么
void worker()
{
    while (true)
    {
        int cmd = 0;
        int n = ::read(0, &cmd, sizeof(cmd));
        if (n == sizeof(cmd))
        {
            tm1.Excute(cmd);
        }
        else if (n == 0)
        {
            cout << "pid:" << getpid() << "退出..." << endl;
            break;
        }
        else
        {}
    }
}